/**
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　　┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　　　　　┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃神兽保佑, 永无BUG!
 * 　　　　┃　　　┃Code is far away from bug with the animal protecting
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━感觉萌萌哒━━━━━━
 */
package com.zkgengkun.support.component;

import com.zkgengkun.constant.SysConstants;
import com.zkgengkun.support.json.Jacksons;
import com.zkgengkun.support.util.UUIDUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.support.CorrelationData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * amqp 消费者
 *
 * @author gengshikun
 * @date 2017/1/3
 */
@Component
public class AmqpSend implements RabbitTemplate.ConfirmCallback {

    private static final Logger logger = LoggerFactory.getLogger(AmqpSend.class);

    private RabbitTemplate rabbitTemplate;

    /**
     * 构造方法注入
     */
    @Autowired
    public AmqpSend(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
        rabbitTemplate.setConfirmCallback(this); //rabbitTemplate如果为单例的话，那回调就是最后设置的内容
    }

    public void sendMsg(String content) {
        this.sendMsg(SysConstants.AMQP_ROUTINGKEY_DEFAULT, content);
    }

    public void sendMap(Map map) {
        this.sendMsg(SysConstants.AMQP_ROUTINGKEY_DEFAULT, Jacksons.json().fromObjectToJson(map));
    }

    public void sendMap(String routingKey, Map map) {
        this.sendMsg(routingKey, Jacksons.json().fromObjectToJson(map));
    }

    public void sendMsg(String routingKey, String content) {
        CorrelationData correlationId = new CorrelationData(UUIDUtils.random32UUID());
        rabbitTemplate.convertAndSend(SysConstants.AMQP_DEFAULT_EXCHANGE, routingKey, content, correlationId);
    }

    /**
     * 回调
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        logger.info(">>>>>>>>>>>>>>>>>> amqp回调:  id:" + correlationData);
        if (ack) {
            logger.info(">>>>>>>>>>>>>>>>>> amqp回调:  消息成功消费");
        } else {
            logger.error(">>>>>>>>>>>>>>>>>> amqp回调:  消息消费失败, 【原因】:" + cause);
        }
    }
}
